package com.ely.coupon.member.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ely.coupon.auth.api.AuthApi;
import com.ely.coupon.auth.api.dto.MemberDTO;
import com.ely.coupon.common.core.constants.RedisConstants;
import com.ely.coupon.common.core.ex.ServiceException;
import com.ely.coupon.common.core.result.ResponseCode;
import com.ely.coupon.common.core.result.ResponseResult;
import com.ely.coupon.common.core.utils.BeanConvertUtils;
import com.ely.coupon.common.redis.dao.RedisDao;
import com.ely.coupon.member.dto.MemberInfo;
import com.ely.coupon.member.dto.SmsInfo;
import com.ely.coupon.member.entity.Member;
import com.ely.coupon.member.mapper.MemberMapper;
import com.ely.coupon.member.message.MessageService;
import com.ely.coupon.member.service.MemberService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.Duration;

@Service
public class MemberServiceImpl implements MemberService {
    @Resource
    private AuthApi authApi;
    @Resource
    private MemberMapper memberMapper;

    @Resource
    private MessageService messageService;

    @Resource
    private RedisDao redisDao;

    @Override
    public ResponseResult<String> auth(String username, String password) {
        return authApi.auth(username, password);
    }

    /**
     * 根据用户名获取成员信息。
     * <p>
     * 本方法通过查询数据库中与给定用户名匹配的成员信息，并将该信息转换为MemberInfo对象返回。
     * 使用了BeanConvertUtils的convertTo方法进行对象之间的转换，提高了代码的可维护性和灵活性。
     *
     * @param username 需要查询的用户名。
     * @return 匹配用户名的成员信息对象，如果找不到匹配项，则返回null。
     */
    @Override
    public MemberInfo getMemberInfo(String username) {
        // 使用QueryWrapper和eq方法构建查询条件，查询与username匹配的成员信息
        return BeanConvertUtils.convertTo(memberMapper.selectOne(new QueryWrapper<Member>()
                .eq(Member.COL_MEMBER_NAME, username)), MemberInfo.class);
    }

    /**
     * 注册
     */
    @Override
    public Integer registerMember(MemberDTO memberDTO) {
        //先判断手机号或者账号是否存在
        if (memberMapper.selectOne(new QueryWrapper<Member>()
                .eq(Member.COL_PHONE, memberDTO.getPhone())
                .or()
                .eq(Member.COL_MEMBER_NAME, memberDTO.getMemberName())) != null) {
            // 若已存在，则抛出服务异常，表示电话号码已注册
            throw new ServiceException(ResponseCode.SYS_USER_PHONE_EXIST_ERROR);
        }

        Member member = BeanConvertUtils.convertTo(memberDTO, Member::new);
        int count = memberMapper.insert(member);
        if (count < 1) {
            throw new ServiceException(ResponseCode.SYS_USER_REGISTER_ERROR);
        }
        //送优惠券
        messageService.send(member.getMemberId() + "");
        return count;
    }

    @Override
    public String generateVerifyCode(String phone) {
        //判断验证码是否存在
        if (!redisDao.hasKey(RedisConstants.Key.MEMBER_CODE_PREFIX + phone)) {
            //生成验证码
            String code = RandomUtil.randomNumbers(6);
            redisDao.setEx(RedisConstants.Key.MEMBER_CODE_PREFIX + phone, code, Duration.ofMinutes(1));
            //通过MQ异步发送消息
            messageService.sendVerifyCode(SmsInfo.builder().code(code).phone(phone).build());
        }
        return "成功";
    }
}
